# -*- coding: utf-8 -*- 
# @Time : ${2020} 11:03 
# @Author : 浩轩
# @File : 字幕添加.py
from PIL import Image, ImageDraw, ImageFont, ImageMode

font_size = 7
text = "人生苦短，我用Python"
img_path = "F://gyy.jpeg"
'''
其实整个过程并不复杂，只有区区不到30行的代码，原理也很简单
我们都知道每张图片都是由像素点组成的，每个像素点都有自己的颜色，
其颜色可以用一个数组来表示：(a,b,c)，其中每位数的取值范围都是 0-255，(0,0,0)代表白色，(255,255,255)代表黑色，也就是我们常说的RGB值
这里我在强调一下，使用的照片最好像素高一点，不然会肉眼看到明显的锯齿感
实现的思路就一句话：只要每个像素取出一个像素值，并使用这个像素做为该字的颜色即可，在像素量够多的情况下，从远处看，是能看到我们原来图像的轮廓的。
首先，使用 pillow.Image读取图像，并使用load函数获取到每一个像素值
'''
#导入ta的图片
img_raw = Image.open('timg.jpg')
img_array = img_raw.load()
# 然后新建一张画布，并选好你要使用的字体和字体大小

# 字体颜色
img_new = Image.new("RGB", img_raw.size, (0, 0, 0))
draw = ImageDraw.Draw(img_new)
# 字体，可以使用windows系统自带的
font = ImageFont.truetype('C:/Windows/fonts/Dengl.ttf', font_size)


# 然后由于需要不断循环 “我喜欢你！”，这五个字符（字符串可以自己自定义）。这里可以使用while循环 yield 来实现一个生成器
def character_generator(text):
    while True:
        for i in range(len(text)):
            yield text[i]


# 接下来，我们要给这些字加上相应的颜色，写入新创建的画布中
ch_gen = character_generator(text)

for y in range(0, img_raw.size[1], font_size):
    for x in range(0, img_raw.size[0], font_size):
        draw.text((x, y), next(ch_gen), font=font, fill=img_array[x, y], direction=None)
# 最后我们把生成的图片保存下来
img_new.convert('RGB').save("python.jpg")
